package com.neutech.maplestory.util;

import com.neutech.maplestory.constant.Constant;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * 项目中处理图片的工具类
 * @author Neuedu-远哥
 * @version 1.0
 * @date 2021/11/27 9:20
 */
public final class ImageUtil {

    private static final Map<String,Image> imgs = new HashMap<>();

    /**
     * 项目中所有图片均在静态代码块中一次性加载
     */
    static {
        // logo
        imgs.put("logo",getImage("logo/logo.png"));
        // 背景中
        // 1. 天空
        imgs.put("sky",getImage("bg/back0.png"));
        // 2. 云1
        imgs.put("cloud1",getImage("bg/back1.png"));

        // 4. 云2
        imgs.put("cloud2",getImage("bg/back3.png"));

        // 主战英雄
        // 站立
        for (int i = 0; i < 4; i++) {
            imgs.put("hero_stand"+i,getImage("hero/stand1_"+i+".png"));
        }
        // 移动
        for (int i = 0; i < 5; i++) {
            imgs.put("hero_walk"+i,getImage("hero/walk1_"+i+".png"));
        }
        // 射击
        for (int i = 0; i < 4; i++) {
            imgs.put("hero_shoot"+i,getImage("hero/shoot1_"+i+".png"));
        }
        // 跳
        imgs.put("hero_jump",getImage("hero/jump_0.png"));
        // 趴
        imgs.put("hero_prone",getImage("hero/prone_0.png"));

        // 弓箭
        imgs.put("arrow",getImage("arrow/arrow.png"));

        // mob01
        // 站立
        imgs.put("mob01_stand",getImage("mob/mob01/stand/0.png"));
        // 移动
        for (int i = 0; i < 4; i++) {
            imgs.put("mob01_walk"+i,getImage("mob/mob01/walk/"+i+".png"));
        }
        // 死亡
        for (int i = 0; i < 13; i++) {
            imgs.put("mob01_die"+i,getImage("mob/mob01/die/"+i+".png"));
        }
        // 被打
        imgs.put("mob01_hit",getImage("mob/mob01/hit/0.png"));
        // mob02

        // 普通怪物的血条
        imgs.put("mob_blood",getImage("blood/blood.png"));

        // pre bg
        imgs.put("bg", getImage("bg/bg.png"));

        // lake
        imgs.put("lake", getImage("bg/lake.png"));
        // sky
        imgs.put("back0", getImage("bg/back0.png"));
        // cloud1
        imgs.put("back1", getImage("bg/back1.png"));
        // hill1
        imgs.put("back2", getImage("bg/back2.png"));
        // cloud2
        imgs.put("back3", getImage("bg/back3.png"));
        // hill2
        imgs.put("back4", getImage("bg/back4.png"));
        // hill3
        imgs.put("back5", getImage("bg/back5.png"));

        // 枫叶落叶的动画图组
        for (int i = 0; i < 14; i++) {
            imgs.put("bg_drop" + i, getImage("bg/ani0/" + i + ".png"));
        }

        // item道具
        imgs.put("HP_50",getImage("item/HP_50.png"));
        imgs.put("HP_150",getImage("item/HP_150.png"));
        imgs.put("HP_300",getImage("item/HP_300.png"));
        imgs.put("HP_MP_50%",getImage("item/HP_MP_50%.png"));
        imgs.put("HP_MP_100%",getImage("item/HP_MP_100%.png"));
        imgs.put("money",getImage("item/money.png"));
        // 道具包
        imgs.put("item_package",getImage("itempackage/ItemPackage.png"));

        // 伤害值数字
        for (int i = 0; i < 10; i++) {
            imgs.put("power" + i,getImage("power/" + i + ".png"));
        }

    }

    /**
     * 根据在map结构中存放的key获取img对象
     * @param key key
     * @return img对象
     */
    public static Image getImageByKey(String key){
        return imgs.get(key);
    }

    private ImageUtil(){}

    /**
     * 通过反射机制加载硬盘中的图片对象，<br>
     * 注意图片对象的路径一定要正确
     * @param imgName 图片名称
     * @return 图片对象
     */
    public static Image getImage(String imgName){
        // 使用网络编程的方法从硬盘中将指定路径加载到内存中
        // 使用反射机制将路径对应的资源加载到类加载器中
        URL u = ImageUtil.class.getClassLoader().getResource(Constant.IMG_PRE + imgName);
        BufferedImage img = null;
        // 通过IO流读到内存中
        try {
            // 出现异常
            img = ImageIO.read(u);
            // 后面的代码将不再执行
            // ...
        } catch (IOException e) {
            // 直接跳转到
            e.printStackTrace();// 打印异常信息
        }
        return img;
    }

    /**
     * 水平镜像翻转图片的方法
     * @param img 要翻转的图片对象
     * @param x x坐标
     * @param y y坐标
     * @return 图形处理之后的形变对象
     */
    public static AffineTransform flipHorizontal(Image img,int x,int y){
        AffineTransform transform = new AffineTransform();
        // 1. 水平翻转x坐标
        transform.scale(-1,1);
        // 2. 图片对象坐标的改变
        transform.translate(-img.getWidth(null),0);
        // 3. 移动其坐标
        transform.translate(-x,y);
        return transform;
    }
}
